1. Summary
1.1 Summary table
Summary statistics for EIE 5Ws reporting, 25 June 2023Indicator | Partners | Counties | June_reached1 | Total_reached | Target | %Target |
|---|
1. Access ECD spaces/schools | 12 | 14 | 7,238 | 188,406 | 1,201,151 | 15.69 |
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |
5. Educators resilience enhancing | 13 | 12 | 729 | 4,859 | 6,018 | 80.74 |
6. Children resilience enhancing | 12 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |
Total | 34 | 18 | 12,015 | 306,0212 | 2,146,5452 | 14.26 |
1Distinct number of schools not available as full list of schools is not reported |
2Only the sum of indicators 1, 2, 5 and 6 |
1.2 By sex and age

Only Indicator 6, Children benefiting from resilience-enhancing
programming sees a higher proportion of females reached over men.

1.3 By county
39.8% of all beneficiaries reached originate from Turkana, though it
only has 14.05% of the targeted population.

IPC data extracted from here.
2. Progress by indicator
2.1 Overall progress

2.2 Reached by indicator
1. Access to ECD spaces/schools
EiE Indicator 1, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
1. Access ECD spaces/schools | 12 | 14 | 7,238 | 188,406 | 1,201,151 | 15.69 |

In June 2023, 7,238 persons were reached by interventions
contributing to this indicator, of which 3,486 were boys and 3,220 were
girls.

2. School feeding programmes
EiE Indicator 2, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |

In June 2023, 1,456 persons were reached by interventions
contributing to this indicator, of which 783 were boys and 673 were
girls.

3. Teaching and learning materials
EiE Indicator 3, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys, 0 were girls, 0 were men and 0
were women.

4. Safe water, personal hygiene
EiE Indicator 4, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys and 0 and were girls.

5. Educators trained in resilience enhancing programmes
EiE Indicator 5, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
5. Educators resilience enhancing | 13 | 12 | 729 | 4,859 | 6,018 | 80.74 |

In June 2023, 729 persons were reached by interventions contributing
to this indicator, of which 474 were men and 255 and were women.

6. Children benefited from resilience enhancing programmes
EiE Indicator 6, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
6. Children resilience enhancing | 12 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |

In June 2023, 2,592 persons were reached by interventions
contributing to this indicator, of which 1,330 were boys and 1,262 and
were girls

3. Partners
3.1 Partners’ operational presence
Below is an interactive table which adds detail to the map above,
serving additional information for coordination – allowing interested
parties to search by county or partner.
The column activities refers to the number of Education
activities implemented by said partner in each county. Each column can
be sorted with the arrows next to each column name. Each column can also
be filtered by typing into the search bar below each column name. Only
completed activities have been included.
Download the dataset below here.
3.2 Summary by implementing partner
The table below breaks down persons reached by partner.
Summary by implementing partnerimplementing_partner | reached1 | counties | activities | %total2 |
|---|
Finn Church Aid | 187,433 | 5 | 6 | 39.08 |
Homa Bay Counties- Department of Education; MoE D | 57,020 | 1 | 1 | 11.89 |
Norwegian Refugee Council | 52,914 | 2 | 3 | 11.03 |
World Vision Kenya | 32,353 | 6 | 6 | 6.75 |
We World | 20,947 | 2 | 1 | 4.37 |
Lifeskill Promoters | 19,199 | 2 | 3 | 4.00 |
Save the Children | 19,062 | 5 | 3 | 3.97 |
WERK | 18,947 | 5 | 2 | 3.95 |
FHK | 17,974 | 2 | 4 | 3.75 |
Jesuit Refugee Service | 14,854 | 1 | 1 | 3.10 |
AVSI Foundation | 9,768 | 2 | 3 | 2.04 |
MOE | 8,241 | 1 | 2 | 1.72 |
Women Educational Researchers of Kenya, | 4,175 | 1 | 1 | 0.87 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.87 |
Nawiri Children Development Program | 3,487 | 1 | 2 | 0.73 |
Mondi | 2,197 | 1 | 1 | 0.46 |
Qatar Charity | 1,541 | 1 | 1 | 0.32 |
Bartabwa | 849 | 1 | 1 | 0.18 |
Special Olympics Kenya | 848 | 3 | 1 | 0.18 |
The Girl Child Network (GCN) | 700 | 2 | 1 | 0.15 |
CDE Mandera | 600 | 1 | 1 | 0.13 |
Frontiers Community Development Program | 491 | 1 | 1 | 0.10 |
CDE Wajir | 361 | 1 | 1 | 0.08 |
Girl Child Network | 350 | 1 | 1 | 0.07 |
ERIKs Development Partner | 249 | 1 | 1 | 0.05 |
Servants of the Poor | 202 | 1 | 1 | 0.04 |
Windle International Kenya | 196 | 1 | 1 | 0.04 |
Dignitas | 135 | 1 | 1 | 0.03 |
SMB | 135 | 1 | 1 | 0.03 |
Missionary Sisters of the Catechism | 85 | 1 | 1 | 0.02 |
Voluntary Service Overseas(VSO) | 42 | 1 | 1 | 0.01 |
Futebol da Forcaa, Moving the Goalposts -Kilifi | 40 | 1 | 1 | 0.01 |
Evangelizing Sisters of Mary | 23 | 1 | 1 | 0.00 |
IWS | 10 | 1 | 2 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
4. Schools and education level
4.1 Schools
The number of schools reached by school feeding programmes and WASH
in schools interventions to-date are:

However, reporting the overall number of schools reached by all EiE
interventions is much more challenging.
Whilst all partners working on indicators 2 and 4 submitted the
number of schools they were working in, the same is not true for the
other indicators. Only indicators 2 and 4 require the reporting of the
number of schools.
4.2 Education level
The data collected on education level is muddled: the combination of
various categories (such as ECE & Primary and
All Basic Education) hampers a clean breakdown by education
level:
Children reached by education leveleducation_level | children | %_of_total |
|---|
Primary | 247,601 | 55.04 |
ECE & Primary | 134,071 | 29.80 |
All Basic Education | 26,104 | 5.80 |
ECE | 24,084 | 5.35 |
Secondary | 17,976 | 4.00 |
Vocational | 23 | 0.01 |
Tertiary | 20 | 0.00 |
For instance, it is not possible to calculate the number of children
served from primary-level institutions.
To understand reporting around the mismatch of education-level
categories, let us examine individual indicators. In the plot below,
children reached have been broken down by education level and by
indicator. The category All Basic Education, whilst present
in all of the indicators, is most heavily used in the WASH-in-schools
intervention. Additionally, this indicator is used by 5 different
implementing partners.

5. Reference maps and tables
5.1 Reference maps
IPC data extracted from here.

5.2 Reference table
Download the EiE 5Ws data here
As a refresher for the reference table below, the indicators are:
Text of EiE indicatorsindicator |
|---|
indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas |
indicator 2 # of schools/ECD spaces with feeding programmes |
indicator 3 # of learners and teachers reached with learning and teaching materials |
indicator 4 # of schools with adequate quantites of safe water for drinking and personal hygiene |
indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCmxvY2F0aW9ucyA8LSByZWFkX3hsc3goIi4vZGF0YS9rZW5fYWRtaW5ib3VuZGFyaWVzX3RhYnVsYXJkYXRhLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICJBRE0yIikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmVpZSA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV81d3MuY3N2IikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpDQoNCnJlcG9ydF9kYXRlIDwtICIyNSBKdW5lIDIwMjMiDQoNCnJlcG9ydF9tb250aCA8LSAiSnVuZSINCg0Kc2l0cmVwX3RhYmxlIDwtIHJlYWRfeGxzeCgiLi9kYXRhL3NpdHJlcF9yZXN1bHRzX3RhYmxlLnhsc3giKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCg0KdGFyZ2V0cyA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV90YXJnZXRzLmNzdiIpDQoNCnBjb2RlMV9zaGFwZSA8LSANCiAgc2Y6OnN0X3JlYWQoIi4vZGF0YS9rZW5fYWRtX2llYmNfMjAxOTEwMzFfc2hwL2tlbl9hZG1ibmRhX2FkbTFfaWViY18yMDE5MTAzMS5zaHAiLCANCiAgICAgICAgICBxdWlldCA9IFRSVUUpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQppcGMgPC0gcmVhZF9jc3YoIi4vZGF0YS9pcGMuY3N2IikNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyAxLiBTdW1tYXJ5DQoNCiMjIDEuMSBTdW1tYXJ5IHRhYmxlDQoNCmBgYHtyfQ0Kc3VtX3N0YXRzIDwtIGVpZSAlPiUgIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoY291bnR5KSwgDQogICAgICAgICAgICByZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIG1lbiA9IHN1bShtZW5bYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB3b21lbiA9IHN1bSh3b21lblthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGJveXMgPSBzdW0oYm95c1thY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdpcmxzID0gc3VtKGdpcmxzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgcmVhY2hlZF8xMjU2ID0gc3VtKHRvdGFsX3JlYWNoZWRbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIiYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggJWluJSByZXBvcnRfbW9udGhdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQoNCg0KDQpzdW1tYXJ5X3RhYmxlIDwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGxhdGVzdF9yZWFjaGVkID0gaWZlbHNlKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoLCB0b3RhbF9yZWFjaGVkLCBOQV9pbnRlZ2VyXykpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgICANCiAgICAgICAgICAgIGxhdGVzdF9yZWFjaGVkID0gc3VtKGxhdGVzdF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBhZG9ybl90b3RhbHMoInJvdyIsLCwsIGxhdGVzdF9yZWFjaGVkLCB0b3RhbF9yZWFjaGVkKSAlPiUgDQogIG11dGF0ZShwYXJ0bmVycyA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgc3VtX3N0YXRzJHBhcnRuZXJzLCBwYXJ0bmVycyksIA0KICAgICAgICAgY291bnRpZXMgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIHN1bV9zdGF0cyRjb3VudGllcywgY291bnRpZXMpLCANCiAgICAgICAgIHRvdGFsX3JlYWNoZWQgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fc3RhdHMkcmVhY2hlZF8xMjU2LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfcmVhY2hlZCksIA0KICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3N0YXRzJGxhdGVzdF9yZWFjaGVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdF9yZWFjaGVkKSkgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZSh0YXJnZXQgPSBzdW0oY291bnR5X3RhcmdldCkpLCANCiAgICAgICAgICAgIGJ5ID0gImluZGljYXRvcl9zaG9ydCIpICU+JSANCiAgbXV0YXRlKHRhcmdldCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cyAlPiUgZGlzdGluY3QoY291bnR5LCBjb3VudHlfb3ZlcmFsbF90YXJnZXQpICU+JSB7c3VtKC4kY291bnR5X292ZXJhbGxfdGFyZ2V0KX0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCkpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQodG90YWxfcmVhY2hlZCAvIHRhcmdldCAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICBzZWxlY3QoaW5kaWNhdG9yID0gaW5kaWNhdG9yX3Nob3J0LCBwYXJ0bmVycywgY291bnRpZXMsIA0KICAgICAgICAgbGF0ZXN0X3JlYWNoZWQsIHRvdGFsX3JlYWNoZWQsIHRhcmdldCwgYCV0YXJnZXRgID0gcGMpICU+JQ0KICBzZWxlY3RfYWxsKH4gZ3N1YigibGF0ZXN0IiwgDQogICAgICAgICAgICAgICAgICAgIHJlcG9ydF9tb250aCwgLikpICU+JQ0KICBzZWxlY3RfYWxsKH4gc3RyX3RvX3RpdGxlKC4pKSAgDQoNCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIlN1bW1hcnkgc3RhdGlzdGljcyBmb3IgRUlFIDVXcyByZXBvcnRpbmcsICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxOjYsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNCwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICIxIiwgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiRGlzdGluY3QgbnVtYmVyIG9mIHNjaG9vbHMgbm90IGF2YWlsYWJsZSBhcyBmdWxsIGxpc3Qgb2Ygc2Nob29scyBpcyBub3QgcmVwb3J0ZWQiKSkgJT4lIA0KICBmb290bm90ZShpID0gNywgaiA9IDU6NiwgcmVmX3N5bWJvbHMgPSAiMiIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIk9ubHkgdGhlIHN1bSBvZiBpbmRpY2F0b3JzIDEsIDIsIDUgYW5kIDYiKSkNCg0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4yIEJ5IHNleCBhbmQgYWdlDQoNCg0KYGBge3J9DQplaWUgJT4lIA0KICBtdXRhdGUoaW5kaWNhdG9yX3Nob3J0ID0gZmN0X3JldihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiBzdW0oLiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG90YWxfcmVhY2hlZCA9IGJveXMgKyBnaXJscyArIG1lbiArIHdvbWVuLCANCiAgICAgICAgIGZlbWFsZSA9ICh3b21lbiArIGdpcmxzKSAvIHRvdGFsX3JlYWNoZWQsIA0KICAgICAgICAgbWFsZSA9IChib3lzICsgbWVuKSAvIHRvdGFsX3JlYWNoZWQpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlLCBtYWxlKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZXgiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwYyIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIGZpbGwgPSBzZXgpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IHBjLCANCiAgICAgICAgICAgICAgICB5ID0gaW5kaWNhdG9yX3Nob3J0LCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSwgDQogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM0NDM5ODMiLCAiIzM1Yjc3OSIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJTZXggYnJlYWtkb3duIGJ5IGluZGljYXRvciIpICANCg0KYGBgDQoNCjxicj4NCg0KT25seSBJbmRpY2F0b3IgNiwgQ2hpbGRyZW4gYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UtZW5oYW5jaW5nIHByb2dyYW1taW5nIHNlZXMgYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBmZW1hbGVzIHJlYWNoZWQgb3ZlciBtZW4uIA0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVpZSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUNCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKG1lbiwgd29tZW4sIGJveXMsIGdpcmxzKSwgfiBzdW0oLikpICU+JSANCiAgZmlsdGVyKCFpcy5uYShpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhtZW4sIHdvbWVuLCBib3lzLCBnaXJscyksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidHlwZSIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInJlYWNoZWQiKSAlPiUgDQogIG11dGF0ZSh0eXBlID0gc3RyX3RvX3RpdGxlKHR5cGUpLCANCiAgICAgICAgIHR5cGUgPSBmY3RfcmVsZXZlbCh0eXBlLCBjKCJNZW4iLCAiV29tZW4iLCAiQm95cyIsICJHaXJscyIpKSkgJT4lIA0KICAjIFlvdSdyZSBqdXN0IGZpbHRlcmluZyB0aGVtIG91dCBtYW51YWxseQ0KICBtdXRhdGUocmVhY2hlZCA9IGNhc2Vfd2hlbigNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIHR5cGUgPT0gIkJveXMiIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiB0eXBlID09ICJHaXJscyIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIHR5cGUgPT0gIk1lbiIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIHR5cGUgPT0gIldvbWVuIiB+IDAsIA0KICAgIFRSVUUgfiByZWFjaGVkDQogICkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gdHlwZSwgeCA9IHJlYWNoZWQsIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocmVhY2hlZCkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEgLyAxMDAwLCBzdWZmaXggPSAiSyIpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjIsIGVuZCA9IC45KSArIA0KICBmYWNldF93cmFwKH4gaW5kaWNhdG9yX3Nob3J0LCBzY2FsZXMgPSAiZnJlZV94IikgKyANCiAgbGFicyh4ID0gIlJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlJlYWNoIGRpc2FnZ3JlZ2F0ZWQgYnkgc2V4IGFuZCBhZ2UiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJFeGNsdWRlcyBzb21lIGluY29ycmVjdCByZXBvcnRpbmcgdW5kZXIgaW5kaWNhdG9ycyA1IGFuZCA2IikNCg0KDQpgYGANCg0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDEuMyBCeSBjb3VudHkNCg0KYGBge3J9DQpjdW1fcGM8LSBlaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUocGNfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGNfdGFyZ2V0ID0gcm91bmQodGFyZ2V0IC8gc3VtKHRhcmdldCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoY3VtX3BjID0gY3Vtc3VtKHBjX2JlbikpDQpgYGANCg0KYHIgY3VtX3BjICU+JSBmaWx0ZXIoY291bnR5ID09ICJUdXJrYW5hIikgJT4lIHB1bGwoY3VtX3BjKWAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQgb3JpZ2luYXRlIGZyb20gVHVya2FuYSwgdGhvdWdoIGl0IG9ubHkgaGFzIGByIGN1bV9wYyAlPiUgZmlsdGVyKGNvdW50eSA9PSAiVHVya2FuYSIpICU+JSBwdWxsKHBjX3RhcmdldClgJSBvZiB0aGUgdGFyZ2V0ZWQgcG9wdWxhdGlvbi4gDQoNCjxicj4NCg0KYGBge3J9DQoNCmVpZSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgIA0KICBtdXRhdGUoY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBzZWN0b3JfcmVhY2hlZCkpICU+JSANCiAgZmlsdGVyKHNlY3Rvcl9yZWFjaGVkID4gMCB8IHRhcmdldCA+IDApICU+JSANCiAgbGVmdF9qb2luKGlwYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG0xX3Bjb2RlLCBwZXJjZW50X3BoYXNlX3AzKSwgDQogICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoc2VjdG9yX3JlYWNoZWQsIHRhcmdldCksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidHlwZSIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IGlmZWxzZSh0eXBlID09ICJ0YXJnZXQiLCAiQ291bnR5IFRhcmdldCIsICJTZWN0b3IgUmVhY2hlZCIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh2YWx1ZSA9IDApKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUsIA0KICAgICAgICAgICAgIHkgPSBjb3VudHksIA0KICAgICAgICAgICAgIGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEodmFsdWUpKSwgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEvMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQpICsgDQogIGZhY2V0X2dyaWQofiB0eXBlLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQzMrIiwNCiAgICAgICB4ID0gIlRhcmdldC9yZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICBjYXB0aW9uID0gIkNvbG91cnMgcmVmZXIgdG8gJSBvZiBjb3VudHkgcG9wdWxhdGlvbiBpbiBJUEMgcGhhc2UgMyBvciBhYm92ZS4gSG9tYSBCYXkgd2FzIG5vdCBhc3Nlc3NlZCBhcyBwYXJ0IG9mIHRoZSBJUEMgQ2xhc3NpZmljYXRpb24iLCANCiAgICAgICB0aXRsZSA9ICJDb21wYXJpc29uIGJldHdlZW4gdGFyZ2V0cyBhbmQgcmVhY2hlZCIpICsNCiAgdGhlbWUoIyBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgIyBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkNCmBgYA0KDQpJUEMgZGF0YSBleHRyYWN0ZWQgZnJvbSBbaGVyZV0oaHR0cHM6Ly93d3cuaXBjaW5mby5vcmcvaXBjLWNvdW50cnktYW5hbHlzaXMvZGV0YWlscy1tYXAvZW4vYy8xMTU2MjEwLz9pc28zPUtFTikuDQoNCjxicj48YnI+PGJyPg0KDQoNCg0KIyAyLiBQcm9ncmVzcyBieSBpbmRpY2F0b3INCg0KIyMgMi4xIE92ZXJhbGwgcHJvZ3Jlc3MNCg0KDQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCg0KbGluZV92YWx1ZXMgPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkNCg0KDQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBncm91cF9ieShkYXRlLCBpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbiwgY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgZ2VvbV9zdGVwKHNpemUgPSAxKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgeCA9IC1JbmYsIHkgPSBJbmYsIGhqdXN0ID0gLTAuMTUsIHZqdXN0ID0gMC45LCBkYXRhID0gbGluZV92YWx1ZXMpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGZhY2V0X3dyYXAofmluZGljYXRvcl9zaG9ydCwgc2NhbGVzID0gImZyZWVfeSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGludGVydmVudGlvbnMiLCANCiAgICAgICB0aXRsZSA9IHBhc3RlMCgiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgIiwgcmVwb3J0X2RhdGUpLA0KICAgICAgIHN1YnRpdGxlID0gIlN1YnRvdGFscyBpbiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIGVhY2ggZmFjZXQiKSANCiAgDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDIuMiBSZWFjaGVkIGJ5IGluZGljYXRvcg0KDQpgYGB7cn0NCmJlbl9wbG90IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gY291bnR5KSkgKyANCiAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHBjKSkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSwgaGp1c3QgPSAiaW53YXJkIiksIA0KICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IikgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQsIGJlZ2luID0gLjIpICsgDQogICAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICAgIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgICAgeSA9ICIiLCANCiAgICAgICAgIGZpbGwgPSAiJSByZWFjaGVkIikgDQp9DQoNCnBjX3Bsb3QgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICAgIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gY291bnR5KSkgKyANCiAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHBjKSkgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAuMSksIGhqdXN0ID0gImlud2FyZCIpLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQsIGJlZ2luID0gLjIpICsgDQogICAgbGFicyh0aXRsZSA9ICIlIG9mIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgICB4ID0gIiUgcmVhY2hlZCIsIA0KICAgICAgICAgeSA9ICIiLCANCiAgICAgICAgIGZpbGwgPSAiJSByZWFjaGVkIikgKw0KICAgIA0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCn0NCmBgYA0KDQpgYGB7cn0NCnRhcmdldHNfcmFuZ2UgPC0gdGFyZ2V0cyAlPiUgDQogIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGNvdW50eV90YXJnZXQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGluZGljYXRvcl9zaG9ydCwgdmFsdWVzX2Zyb20gPSB0YXJnZXQpICU+JSANCiAgc2V0TmFtZXMoYygiY291bnR5IiwgImluZGljYXRvcjEiLCAiaW5kaWNhdG9yMiIsICJpbmRpY2F0b3IzIiwgImluZGljYXRvcjQiLCANCiAgICAgICAgICAgICAiaW5kaWNhdG9yNSIsICJpbmRpY2F0b3I2IikpDQoNCmluZGljYXRvcl9tYXAgPC0gZnVuY3Rpb24odGJsLCBpbmRpY2F0b3JfbnVtYmVyLCBwbG90X29wdGlvbikgew0KICANCiAgcGxvdF9vcHRpb24gPC0gZW5xdW8ocGxvdF9vcHRpb24pDQogIGluZGljYXRvcl9udW1iZXIgPC0gZW5xdW8oaW5kaWNhdG9yX251bWJlcikNCiAgDQogIHRibCAlPiUgDQogICAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAhIWluZGljYXRvcl9udW1iZXIpKSAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgISFpbmRpY2F0b3JfbnVtYmVyKSkgJT4lDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDAgfCBjb3VudHlfdGFyZ2V0ID4gMCkgICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBuYW5pYXI6OnJlcGxhY2Vfd2l0aF9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIA0KICAgICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSA9IGFkbTFfZW4sIGFkbTFfcGNvZGUpLCANCiAgICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICAgIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCBieSA9IGMoImFkbTFfcGNvZGUiKSkgJT4lDQogICAgc3RfYXNfc2YoKSAlPiUgDQogICAgZ2dwbG90KCkgKyANCiAgICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICAgIGFlcyhmaWxsID0gISFwbG90X29wdGlvbikpICsgDQogICAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKCEhcGxvdF9vcHRpb24pKSwNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsDQogICAgICAgICAgICAgICAgIHNpemUgPSAyLjUpICsgDQogICAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogICAgdGhlbWVfdm9pZCgpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkNCiAgICANCn0NCg0KYGBgDQoNCiMjIyAxLiBBY2Nlc3MgdG8gRUNEIHNwYWNlcy9zY2hvb2xzDQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjEiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMSwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgZm9udHNpemUoaSA9IDEsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IxKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBBY2Nlc3MgdG8gRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLg0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjEuIENoaWxkcmVuIGFjY2Vzc2luZyBFQ0Qgc3BhY2VzL3NjaG9vbHMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQogDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLiBTY2hvb2wgZmVlZGluZyBwcm9ncmFtbWVzDQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjIiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMiwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgZm9udHNpemUoaSA9IDEsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIyIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIyIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMi4gU2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMi4gRmVlZGluZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIyAzLiBUZWFjaGluZyBhbmQgbGVhcm5pbmcgbWF0ZXJpYWxzDQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjMiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMywgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgZm9udHNpemUoaSA9IDEsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIzIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIzIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMyksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMy4gVGVhY2hpbmcgYW5kIGxlYXJuaW5nIG1hdGVyaWFscywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cywgIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJG1lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgbWVuIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHdvbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSB3b21lbi4gDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIzLiBUZWFjaGluZyBtYXRlcmlhbHMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyA0LiBTYWZlIHdhdGVyLCBwZXJzb25hbCBoeWdpZW5lDQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjQiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNCwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgZm9udHNpemUoaSA9IDEsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI0IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI0IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNCksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNC4gU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZSwgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIGdpcmxzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNC4gU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZSIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNS4gRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcw0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI1IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDUsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxLCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNSIsIGNvdW50eV90YXJnZXQpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmEudmFsdWUgPSAiZ3JleTgwIiwgbGltaXRzID0gcmFuZ2UoYygwLCAxODEzKSkpICsgDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjUiLCBiZW5lZmljaWFyaWVzKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI1LiBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJG1lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgbWVuIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHdvbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgd29tZW4uIA0KDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjUuIEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNi4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcw0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI2IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDYsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxLCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNiIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNiIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjYpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjYuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIGdpcmxzIA0KDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjYuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMgMy4gUGFydG5lcnMNCg0KIyMgMy4xIFBhcnRuZXJzJyBvcGVyYXRpb25hbCBwcmVzZW5jZQ0KDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9N30NCg0KcGFydG5lcl9tYXAgPC0gZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGxlYWRfb3JnYW5pc2F0aW9uID0gbl9kaXN0aW5jdChsZWFkX29yZ2FuaXNhdGlvbiksDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpLCANCiAgICAgICAgICAgIHdvbWVuID0gc3VtKHdvbWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBtZW4gPSBzdW0obWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShyZWFjaGVkID0gbWVuICsgd29tZW4gKyBib3lzICsgZ2lybHMsIA0KICAgICAgICAgbWFsZSA9IG1lbiArIGJveXMsIA0KICAgICAgICAgZmVtYWxlID0gd29tZW4gKyBnaXJscywgDQogICAgICAgICBtYWxlX3BjID0gcm91bmQobWFsZSAvIHJlYWNoZWQgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGZlbWFsZV9wYyA9IHJvdW5kKGZlbWFsZSAvIHJlYWNoZWQgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIG11dGF0ZShwYXJ0bmVyc19jb2xvdXIgPSBwYXJ0bmVycyArIHJ1bmlmKDEsIG1pbiA9IC0uMSwgbWF4ID0gLjEpKSAlPiUgDQogIGxlZnRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBkYXRhID0gcGNvZGUxX3NoYXBlKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBhcnRuZXJzLCANCiAgICAgICAgICAgICAgY29sb3VyID0gYWRtMV9wY29kZSkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoIA0KICAgIGNvdW50eSwgIlxuIiwgcGFydG5lcnMpLCANCiAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgICAgICAgICAgICJDb3VudHk6ICIsIGNvdW50eSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIlBhcnRuZXJzOiAiLCBwYXJ0bmVycywgIlxuIiwgDQogICAgICAgICAgICAgICAgIlJlYWNoZWQ6ICIsIGNvbW1hKHNlY3Rvcl9yZWFjaGVkKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIkZlbWFsZV9yZWFjaGVkJTogIiwgZmVtYWxlX3BjLCAiJSIsICJcbiIsIA0KICAgICAgICAgICAgICAgICJNYWxlX3JlYWNoZWQlOiAiLCBtYWxlX3BjLCAiJSIpKSwgDQogICAgICAgICAgICAgICAgc2l6ZSA9IDMsIGNvbG91ciA9ICJncmF5NDAiKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEsIDMsIDUsIDcsIDksIDExKSkgKyANCiAgDQogIHRoZW1lX3ZvaWQoKSArIA0KICAjIFJlbWVtYmVyIHRoYXQgeW91IG5lZWQgZ3VpZGVfY29sb3JiYXIsIG5vdCBndWlkZV9sZWdlbmQNCiAgIyBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKHJldmVyc2UgPSBUUlVFKSkgKyANCiAgbGFicyh0aXRsZSA9ICJLRU5ZQTogRWR1Y2F0aW9uIGluIEVtZXJnZW5jaWVzIFdvcmtpbmcgR3JvdXAgb3BlcmF0aW9uYWwgcHJlc2VuY2UiLCANCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcmVwb3J0X2RhdGUpLCANCiAgICAgICBmaWxsID0gIlBhcnRuZXJzIikNCg0KDQpnZ3Bsb3RseShwYXJ0bmVyX21hcCwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoc3VtX3N0YXRzJHBhcnRuZXJzLCAiIEVpRSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYWNyb3NzICIsIHN1bV9zdGF0cyRjb3VudGllcywgIiBjb3VudGllcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzIG9mICIsIHJlcG9ydF9kYXRlLCAiOyBtb3VzZSBvdmVyIGNvdW50eSBuYW1lIGZvciBtb3JlIGRldGFpbHMiLCAiPC9zdXA+IikpKQ0KYGBgDQoNCg0KPGJyPg0KDQpCZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSB0YWJsZSB3aGljaCBhZGRzIGRldGFpbCB0byB0aGUgbWFwIGFib3ZlLCBzZXJ2aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGNvb3JkaW5hdGlvbiAtLSBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc2VhcmNoIGJ5IGNvdW50eSBvciBwYXJ0bmVyLiANCg0KIFRoZSBjb2x1bW4gYGFjdGl2aXRpZXNgIHJlZmVycyB0byB0aGUgbnVtYmVyIG9mIEVkdWNhdGlvbiBhY3Rpdml0aWVzIGltcGxlbWVudGVkIGJ5IHNhaWQgcGFydG5lciBpbiBlYWNoIGNvdW50eS4gRWFjaCBjb2x1bW4gY2FuIGJlIHNvcnRlZCB3aXRoIHRoZSBhcnJvd3MgbmV4dCB0byBlYWNoIGNvbHVtbiBuYW1lLiBFYWNoIGNvbHVtbiBjYW4gYWxzbyBiZSBmaWx0ZXJlZCBieSB0eXBpbmcgaW50byB0aGUgc2VhcmNoIGJhciBiZWxvdyBlYWNoIGNvbHVtbiBuYW1lLiBPbmx5IGNvbXBsZXRlZCBhY3Rpdml0aWVzIGhhdmUgYmVlbiBpbmNsdWRlZC4NCiANCmBgYHtyfQ0KZWllICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pLCB+IA0KICAgICAgICAgICAgICBzdHJfc3ViKC4sIGVuZCA9IDUwTCkpICU+JSAgDQogIGdyb3VwX2J5KGNvdW50eSwgYWRtMV9wY29kZSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHdyaXRlX2NzdigiLi9kYXRhL2JyZWFrZG93bl9ieV9jb3VudHlfcGFydG5lci5jc3YiKQ0KYGBgDQogDQoNCkRvd25sb2FkIHRoZSBkYXRhc2V0IGJlbG93IFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20va2VueWEtZWllLXdnL2VpZV93Z181d3MvYmxvYi9tYWluL2RhdGEvYnJlYWtkb3duX2J5X2NvdW50eV9wYXJ0bmVyLmNzdikuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pLCB+IA0KICAgICAgICAgICAgICBzdHJfc3ViKC4sIGVuZCA9IDUwTCkpICU+JSAgDQogIGdyb3VwX2J5KGNvdW50eSwgYWRtMV9wY29kZSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHNlbGVjdF9hbGwoLiwgfiBzdHJfdG9fdGl0bGUoLikpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgY291bnR5IGFuZCBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJSZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygiUmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMy4yIFN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXINCg0KVGhlIHRhYmxlIGJlbG93IGJyZWFrcyBkb3duIHBlcnNvbnMgcmVhY2hlZCBieSBwYXJ0bmVyLiANCg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCg0KIyA0LiBTY2hvb2xzIGFuZCBlZHVjYXRpb24gbGV2ZWwNCg0KIyMgNC4xIFNjaG9vbHMNCg0KVGhlIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQgYnkgc2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcyBhbmQgV0FTSCBpbiBzY2hvb2xzIGludGVydmVudGlvbnMgdG8tZGF0ZSBhcmU6IA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjaG9vbHMpKSAlPiUNCiAgbXV0YXRlKGRhdGUgPSBuYW1lX3RvX2RhdGUobW9udGgpKSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjJ8NCIpKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2Uoc2Nob29scyA9IHN1bShzY2hvb2xzKSwgDQogICAgICAgICAgICByZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQpKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX3NjaG9vbHMgPSBjdW1zdW0oc2Nob29scykpICU+JSANCiAgYXJyYW5nZShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9zY2hvb2xzKSwgDQogICAgICAgICB2anVzdCA9IC0uNSkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsgDQogIGdlb21fbGluZShzaXplID0gMS43LCANCiAgICAgICAgICAgIGFlcyhjb2xvdXIgPSBpbmRpY2F0b3Jfc2hvcnQpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoY3VtX3NjaG9vbHMpKSwgdmp1c3QgPSAtLjUpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjMzE2ODhlIiwgIiNkODU3NmIiKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIiwgDQogICAgICAgdGl0bGUgPSAiU2Nob29scyByZWFjaGVkIGJ5IGZlZWRpbmcgcHJvZ3JhbW1lcyBhbmQgV0FTSCBpbiBzY2hvb2xzIiwgDQogICAgICAgY29sb3VyID0gIkluZGljYXRvciIpDQoNCg0KYGBgDQoNCjxicj4NCg0KSG93ZXZlciwgcmVwb3J0aW5nIHRoZSBvdmVyYWxsIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQgYnkgYWxsIEVpRSBpbnRlcnZlbnRpb25zIGlzIG11Y2ggbW9yZSBjaGFsbGVuZ2luZy4NCg0KV2hpbHN0IGFsbCBwYXJ0bmVycyB3b3JraW5nIG9uIGluZGljYXRvcnMgMiBhbmQgNCBzdWJtaXR0ZWQgdGhlIG51bWJlciBvZiBzY2hvb2xzIHRoZXkgd2VyZSB3b3JraW5nIGluLCB0aGUgc2FtZSBpcyBub3QgdHJ1ZSBmb3IgdGhlIG90aGVyIGluZGljYXRvcnMuIE9ubHkgaW5kaWNhdG9ycyAyIGFuZCA0IHJlcXVpcmUgdGhlIHJlcG9ydGluZyBvZiB0aGUgbnVtYmVyIG9mIHNjaG9vbHMuIA0KDQoNCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgNC4yIEVkdWNhdGlvbiBsZXZlbCANCg0KVGhlIGRhdGEgY29sbGVjdGVkIG9uIGVkdWNhdGlvbiBsZXZlbCBpcyBtdWRkbGVkOiB0aGUgY29tYmluYXRpb24gb2YgdmFyaW91cyBjYXRlZ29yaWVzIChzdWNoIGFzIGBFQ0UgJiBQcmltYXJ5YCBhbmQgYEFsbCBCYXNpYyBFZHVjYXRpb25gKSBoYW1wZXJzIGEgY2xlYW4gYnJlYWtkb3duIGJ5IGVkdWNhdGlvbiBsZXZlbDogDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBtdXRhdGVfYXQodmFycyhnaXJscywgYm95cywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGVkdWNhdGlvbl9sZXZlbCkpICU+JSANCiAgbXV0YXRlKGNoaWxkcmVuID0gYm95cyArIGdpcmxzKSAlPiUgDQogIGdyb3VwX2J5KGVkdWNhdGlvbl9sZXZlbCkgJT4lIA0KICBzdW1tYXJpc2UoY2hpbGRyZW4gPSBzdW0oY2hpbGRyZW4pKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhjaGlsZHJlbikpICU+JSANCiAgbXV0YXRlKGAlX29mX3RvdGFsYCA9IHJvdW5kKGNoaWxkcmVuIC8gc3VtKGNoaWxkcmVuKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIkNoaWxkcmVuIHJlYWNoZWQgYnkgZWR1Y2F0aW9uIGxldmVsIikgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQpgYGANCg0KPGJyPg0KDQpGb3IgaW5zdGFuY2UsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBzZXJ2ZWQgZnJvbSBwcmltYXJ5LWxldmVsIGluc3RpdHV0aW9ucy4gDQoNClRvIHVuZGVyc3RhbmQgcmVwb3J0aW5nIGFyb3VuZCB0aGUgbWlzbWF0Y2ggb2YgZWR1Y2F0aW9uLWxldmVsIGNhdGVnb3JpZXMsIGxldCB1cyBleGFtaW5lIGluZGl2aWR1YWwgaW5kaWNhdG9ycy4gSW4gdGhlIHBsb3QgYmVsb3csIGNoaWxkcmVuIHJlYWNoZWQgaGF2ZSBiZWVuIGJyb2tlbiBkb3duIGJ5IGVkdWNhdGlvbiBsZXZlbCBhbmQgYnkgaW5kaWNhdG9yLiBUaGUgY2F0ZWdvcnkgYEFsbCBCYXNpYyBFZHVjYXRpb25gLCB3aGlsc3QgcHJlc2VudCBpbiBhbGwgb2YgdGhlIGluZGljYXRvcnMsIGlzIG1vc3QgaGVhdmlseSB1c2VkIGluIHRoZSBXQVNILWluLXNjaG9vbHMgaW50ZXJ2ZW50aW9uLiBBZGRpdGlvbmFsbHksIHRoaXMgaW5kaWNhdG9yIGlzIHVzZWQgYnkgNSBkaWZmZXJlbnQgaW1wbGVtZW50aW5nIHBhcnRuZXJzLiANCg0KPGJyPg0KDQpgYGB7cn0NCg0KDQplaWUgJT4lIA0KICBtdXRhdGVfYXQodmFycyhnaXJscywgYm95cywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGVkdWNhdGlvbl9sZXZlbCkpICU+JSANCiAgbXV0YXRlKHJlYWNoZWQgPSBib3lzICsgZ2lybHMgKyBtZW4gKyB3b21lbikgJT4lIA0KICBncm91cF9ieShlZHVjYXRpb25fbGV2ZWwsIGluZGljYXRvcl9zaG9ydCkgJT4lDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHJlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKHJlYWNoZWQpKSAlPiUgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUocGMgPSByZWFjaGVkIC8gdG90YWwsIA0KICAgICAgICAgaW5kaWNhdG9yX3Nob3J0ID0gZmN0X3JldihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gaW5kaWNhdG9yX3Nob3J0LCBmaWxsID0gZWR1Y2F0aW9uX2xldmVsKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBwYywgDQogICAgICAgICAgICAgICAgeSA9IGluZGljYXRvcl9zaG9ydCwgDQogICAgICAgICAgICAgICAgbGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IDEpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSksIA0KICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIikgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiRWR1Y2F0aW9uLWxldmVsIGJyZWFrZG93biBieSBpbmRpY2F0b3IiLCANCiAgICAgICBmaWxsID0gIiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQ0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQoNCg0KDQoNCiMgNS4gUmVmZXJlbmNlIG1hcHMgYW5kIHRhYmxlcyANCg0KIyMgNS4xIFJlZmVyZW5jZSBtYXBzIA0KDQpJUEMgZGF0YSBleHRyYWN0ZWQgZnJvbSBbaGVyZV0oaHR0cHM6Ly93d3cuaXBjaW5mby5vcmcvaXBjLWNvdW50cnktYW5hbHlzaXMvZGV0YWlscy1tYXAvZW4vYy8xMTU2MjEwLz9pc28zPUtFTikuIA0KDQpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTB9DQppcGMgJT4lIA0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbnVtYmVyX3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKG51bWJlcl9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAiaW5mZXJubyIsIGJlZ2luID0gLjQsICwgZGlyZWN0aW9uID0gLTEpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAiQXQgbGVhc3RcbnBoYXNlIDMiLCANCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgcGVyc29ucyBJUEMgUGhhc2UgMyBvciBhYm92ZSIsIA0KICAgICAgIHN1YnRpdGxlID0gIlNvdXJjZTogaHR0cHM6Ly93d3cuaXBjaW5mby5vcmcvIikgKyANCg0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBlcmNlbnRfcGhhc2VfcDMpKSArIA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwZXJjZW50X3BoYXNlX3AzKSksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IHBlcmNlbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgSVBDIHBoYXNlIDMiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIHBvcHVsYXRpb24gSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsNCg0KDQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDApICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHNlY3Rvcl9yZWFjaGVkKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHNlY3Rvcl9yZWFjaGVkKSksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gLjIsDQogICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMzk0ODMpKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIlNlY3RvclxucmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIlJlYWNoZWQgcGVyc29ucyIpICsgDQogIA0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoYWRtMV9wY29kZSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QocmVhY2hlZCA9IDAsIHRhcmdldCA9IDApKSAlPiUgDQogIG11dGF0ZShwYyA9IGlmZWxzZSh0YXJnZXQgPT0gMCwgMCwgcmVhY2hlZCAvIHRhcmdldCkpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcGMpKSArIA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAxKSksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwNCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwNCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gLjIpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAiJSBvZiB0YXJnZXQiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIG92ZXJhbGwgY291bnR5IHRhcmdldCByZWFjaGVkIikgKyAgIA0KDQpwbG90X2xheW91dChuY29sID0gMiwgDQogICAgICAgICAgICBucm93ID0gMikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgNS4yIFJlZmVyZW5jZSB0YWJsZSANCg0KRG93bmxvYWQgdGhlIEVpRSA1V3MgZGF0YSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2VpZV81d3MuY3N2KQ0KDQpBcyBhIHJlZnJlc2hlciBmb3IgdGhlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdywgdGhlIGluZGljYXRvcnMgYXJlOiANCg0KYGBge3J9DQplaWUgJT4lIA0KICBkaXN0aW5jdChpbmRpY2F0b3IpICU+JSANCiAgYXJyYW5nZShpbmRpY2F0b3IpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlRleHQgb2YgRWlFIGluZGljYXRvcnMiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKHdpZHRoID0gLjgsIGxheW91dCA9ICJhdXRvZml0IikNCg0KYGBgDQoNCjxicj4NCg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSwgDQogICAgICAgICBpbmRpY2F0b3JfbnVtYmVyID0gcGFyc2VfbnVtYmVyKGluZGljYXRvcl9zaG9ydCkpICU+JQ0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3JfbnVtYmVyKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGluZGljYXRvciA9IGluZGljYXRvcl9udW1iZXIsIHJlYWNoZWQsIGFkbTFfcGNvZGUpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgaW5kaWNhdG9yLCBjb3VudHkgYW5kIGltcGxlbWVudGluZyBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJyZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygicmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K